home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / TinyGL / ami / content / ad709 / tinygl / src / zline.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-15  |  2.6 KB  |  121 lines

  1. {
  2.     int                        n, dx, dy, sx, pp_inc_1, pp_inc_2;
  3.     register int            a;
  4.     register PIXEL            *pp;
  5. #if defined(INTERP_RGB) || TGL_FEATURE_RENDER_BITS == 24
  6.     register unsigned int    r, g, b;
  7. #endif
  8. #ifdef INTERP_RGB
  9.     register unsigned int    rinc, ginc, binc;
  10. #endif
  11. #ifdef INTERP_Z
  12.     register unsigned short *pz;
  13.     int                        zinc;
  14.     register int            z, zz;
  15. #endif
  16.     if(p1->y > p2->y || (p1->y == p2->y && p1->x > p2->x)) {
  17.         ZBufferPoint    *tmp;
  18.         tmp = p1;
  19.         p1 = p2;
  20.         p2 = tmp;
  21.     }
  22.     sx = zb->xsize;
  23.     pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p1->y + p1->x * PSZB);
  24. #ifdef INTERP_Z
  25.     pz = zb->zbuf + (p1->y * sx + p1->x);
  26.     z = p1->z;
  27. #endif
  28.     dx = p2->x - p1->x;
  29.     dy = p2->y - p1->y;
  30. #ifdef INTERP_RGB
  31.     r = p2->r << 8;
  32.     g = p2->g << 8;
  33.     b = p2->b << 8;
  34. #elif TGL_FEATURE_RENDER_BITS == 24
  35.     /* for 24 bits, we store the colors in different variables */
  36.     r = p2->r >> 8;
  37.     g = p2->g >> 8;
  38.     b = p2->b >> 8;
  39. #endif
  40. #ifdef INTERP_RGB
  41.     #define RGB(x)    x
  42.     #if TGL_FEATURE_RENDER_BITS == 24
  43.         #define RGBPIXEL    pp[0] = r >> 16, pp[1] = g >> 16, pp[2] = b >> 16
  44.     #else
  45.         #define RGBPIXEL    * pp = RGB_TO_PIXEL(r >> 8, g >> 8, b >> 8)
  46.     #endif
  47. #else /* INTERP_RGB */
  48.     #define RGB(x)
  49.     #if TGL_FEATURE_RENDER_BITS == 24
  50.         #define RGBPIXEL    pp[0] = r, pp[1] = g, pp[2] = b
  51.     #else
  52.         #define RGBPIXEL    * pp = color
  53.     #endif
  54. #endif /* INTERP_RGB */
  55.  
  56. #ifdef INTERP_Z
  57.     #define ZZ(x)        x
  58.     #define PUTPIXEL()    { zz = z >> ZB_POINT_Z_FRAC_BITS; if(ZCMP(zz, *pz)) { RGBPIXEL; *pz = zz; } }
  59. #else /* INTERP_Z */
  60.     #define ZZ(x)
  61.     #define PUTPIXEL()    RGBPIXEL
  62. #endif /* INTERP_Z */
  63.  
  64. #define DRAWLINE(dx, dy, inc_1, inc_2) \
  65.         n = dx; \
  66.         ZZ(zinc = (p2->z - p1->z) / n); \
  67.         RGB(rinc = ((p2->r - p1->r) << 8) / n; ginc = ((p2->g - p1->g) << 8) / n; binc = ( \
  68.                             (p2->b - p1->b) << 8) / n); \
  69.         a = 2 * dy - dx; \
  70.         dy = 2 * dy; \
  71.         dx = 2 * dx - dy; \
  72.         pp_inc_1 = (inc_1) * PSZB; \
  73.         pp_inc_2 = (inc_2) * PSZB; \
  74.         do { \
  75.             PUTPIXEL(); \
  76.             ZZ(z += zinc); \
  77.             RGB(r += rinc; g += ginc; b += binc); \
  78.             if(a > 0) { \
  79.                 pp = (PIXEL *) ((char *) pp + pp_inc_1); \
  80.                 ZZ(pz += (inc_1)); \
  81.                 a -= dx; \
  82.             } \
  83.             else { \
  84.                 pp = (PIXEL *) ((char *) pp + pp_inc_2); \
  85.                 ZZ(pz += (inc_2)); \
  86.                 a += dy; \
  87.             } \
  88.         } while(--n >= 0);
  89.  
  90.     /* fin macro */
  91.     if(dx == 0 && dy == 0) {
  92.         PUTPIXEL();
  93.     }
  94.     else if(dx > 0) {
  95.         if(dx >= dy) {
  96.             DRAWLINE(dx, dy, sx + 1, 1);
  97.         }
  98.         else {
  99.             DRAWLINE(dy, dx, sx + 1, sx);
  100.         }
  101.     }
  102.     else {
  103.         dx = -dx;
  104.         if(dx >= dy) {
  105.             DRAWLINE(dx, dy, sx - 1, -1);
  106.         }
  107.         else {
  108.             DRAWLINE(dy, dx, sx - 1, sx);
  109.         }
  110.     }
  111. }
  112. #undef INTERP_Z
  113. #undef INTERP_RGB
  114.  
  115. /* internal defines */
  116. #undef DRAWLINE
  117. #undef PUTPIXEL
  118. #undef ZZ
  119. #undef RGB
  120. #undef RGBPIXEL
  121.